home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / amok_lha / amok82.lha / Autodoc2.6 / Autodoc.mod < prev    next >
Text File  |  1993-08-15  |  7KB  |  274 lines

  1. (*(***********************************************************************
  2.  
  3. :Program.    Autodoc.mod
  4. :Contents.   extracts autodocs from source
  5. :Author.     Hartmut Goebel [hG]
  6. :Address.    Aufseßplatz 5, D-8500 Nürnberg 40
  7. :Address.    UseNet: hartmut@oberon.nbg.sub.org
  8. :Address.    Z-Netz: hartmut@asn.zer   Fido: 2:246/81.1
  9. :Copyright.  Copyright © 1993 by Hartmut Goebel
  10. :Language.   Oberon
  11. :Translator. Amiga Oberon V3.0
  12. :History.    V2.0, 03 Jan 1993 [hG]
  13.  
  14. :Version.    $VER: Autodoc.mod 2.6 (10.1.93)
  15.  
  16. (* $StackChk- $NilChk- $RangeChk- $CaseChk- $OvflChk- $ReturnChk- $ClearVars- *)
  17. ***********************************************************************)*)
  18.  
  19. MODULE Autodoc;
  20.  
  21. IMPORT
  22.   args:= Arguments,
  23.   Break,  (* checks for Ctrl-C *)
  24.   Conversions,
  25.   asc := ASCII,
  26.   avl := AVL,
  27.   fs := FileSystem,
  28.   io,
  29.   ms := MoreStrings,
  30.   str := Strings;
  31.  
  32. CONST
  33.   versionString = "$VER: autodoc 2.6 (10.1.93)";
  34.  
  35. TYPE
  36.   Entry = POINTER TO EntryDesc;
  37.   EntryDesc = RECORD (avl.SNode)
  38.     start: LONGINT;
  39.     interface: BOOLEAN;
  40.   END;
  41.  
  42. VAR
  43.   nArgs, argCnt: INTEGER;
  44.   file: fs.File;
  45.   root: avl.SRoot;
  46.   filename, text: ARRAY 256 OF CHAR;
  47.  
  48. CONST
  49.   defaultTextWidth = 78; maxTextWidth = SIZE(text);
  50.   defaultTabSize = 8;
  51.  
  52. VAR
  53.   internal: BOOLEAN;
  54.   toc, ff, wordWrap: BOOLEAN;
  55.   cStyle, asteric, modula, semicolon: BOOLEAN;
  56.   textWidth, tabSize: LONGINT;
  57.  
  58. PROCEDURE TableOfContents(node: avl.NodePtr);
  59. BEGIN
  60.   WITH node: Entry DO
  61.     io.WriteString(node.name);
  62.     io.WriteLn;
  63.   END;
  64. END TableOfContents;
  65.  
  66.  
  67. PROCEDURE WriteEntry(node: avl.NodePtr);
  68.  
  69.   PROCEDURE WrapString();
  70.   VAR
  71.     c: CHAR;
  72.   BEGIN
  73.     IF wordWrap THEN
  74.       LOOP
  75.         IF str.Length(text) < textWidth THEN EXIT END;
  76.         c := text[textWidth];
  77.         text[textWidth] := CHR(0);
  78.         io.WriteString(text); io.WriteLn;
  79.         text[textWidth] := c;
  80.         str.Delete(text,0,textWidth);
  81.       END;
  82.     END;
  83.     io.WriteString(text); io.WriteLn;
  84.   END WrapString;
  85.  
  86. VAR
  87.   i: INTEGER;
  88.   eFile: fs.File;
  89. BEGIN
  90.   WITH node: Entry DO
  91.     io.WriteString(node.name);
  92.     (* $RangeChk- *)
  93.     i := SHORT(textWidth) - 2 * SHORT(str.Length(node.name)); (* name is max 80 char *)
  94.     (* $RangeChk= *)
  95.     WHILE i > 0 DO
  96.      io.Write(" "); DEC(i);
  97.     END;
  98.     io.WriteString(node.name);
  99.     io.WriteLn;
  100.     IF node.interface THEN
  101.       IF ~ fs.Open(eFile,filename,FALSE) THEN
  102.         io.WriteString("can't open .def"); io.WriteLn;
  103.         HALT(20);
  104.       END;
  105.       io.WriteLn;
  106.       WHILE fs.ReadString(eFile,text) DO
  107.         WrapString;
  108.       END;
  109.       IF ff THEN io.Write(asc.ff); END;
  110.       IF fs.Close(eFile) THEN END;
  111.     ELSE
  112.       IF ~ fs.Move(file,node.start) THEN
  113.         io.WriteString("error in file");
  114.         io.WriteLn;
  115.         HALT(20);
  116.       END;
  117.       WHILE fs.ReadString(file,text) DO
  118.         str.Delete(text,0,1);
  119.         IF ms.StrCmpN(text,"***",3) = 0 THEN
  120.           IF ff THEN io.Write(asc.ff); END;
  121.           RETURN;
  122.         END;
  123.         WrapString;
  124.       END;
  125.     END;
  126.   END;
  127. END WriteEntry;
  128.  
  129.  
  130. PROCEDURE ProcessFile();
  131. VAR
  132.   entry: Entry;
  133.   i: LONGINT;
  134.   adtext: ARRAY 10 OF CHAR;
  135.  
  136.   PROCEDURE IsEntryStart(): BOOLEAN;
  137.   CONST
  138.     adTextLen  = 5; intPos = 5;
  139.     astText  = "*****";
  140.     modText  = "(****";
  141.     semText  = ";****";
  142.     cStText  = "/****";
  143.  
  144.   BEGIN
  145.     RETURN (  internal & (text[intPos] = "i") OR
  146.             ~ internal & (text[intPos] = "*"))
  147.          & (text[intPos+1] = "*") & (text[intPos+2] = " ")
  148.          & (asteric   & (ms.StrCmpN(astText,text,adTextLen) = 0) OR
  149.             modula    & (ms.StrCmpN(modText,text,adTextLen) = 0) OR
  150.             semicolon & (ms.StrCmpN(semText,text,adTextLen) = 0) OR
  151.             cStyle    & (ms.StrCmpN(cStText,text,adTextLen) = 0));
  152.   END IsEntryStart;
  153.  
  154. BEGIN
  155.   IF ~ fs.Open(file,filename,FALSE) THEN
  156.     io.WriteString("can't open file "); io.WriteString(filename); io.WriteLn;
  157.     HALT(20);
  158.   END;
  159.   avl.SInit(root);
  160.  
  161.   (* check for .def *)
  162.   IF modula THEN
  163.     i := SHORT(str.Occurs(filename,".mod"));
  164.     IF (i > 0) & (i = str.Length(filename)-4) THEN
  165.       filename[i] := CHR(0);
  166.       text := filename;
  167.       str.Append(filename,".def");
  168.       IF fs.Exists(filename) THEN
  169.         NEW(entry);
  170.         i := ms.OccursCharPos(text,"/",-SHORT(str.Length(text)-1));
  171.         IF i >= 0 THEN
  172.           str.Delete(text,0,i+1);
  173.         END;
  174.         str.Append(text,"/--interface--");
  175.         COPY(text,entry.name);
  176.         entry.interface := TRUE;
  177.         IF avl.SAdd(root,entry) THEN END;
  178.       END;
  179.     END;
  180.   END;
  181.  
  182.   WHILE fs.ReadString(file,text) DO
  183.     IF IsEntryStart() THEN
  184.       str.Delete(text,0,8);
  185.       i := ms.OccursChar(text," ");
  186.       IF i >= 0 THEN
  187.         text[i] := CHR(0);
  188.       END;
  189.       NEW(entry);
  190.       COPY(text,entry.name);
  191.       entry.start := fs.Position(file);
  192.       entry.interface := FALSE;
  193.       IF ~ avl.SAdd(root,entry) THEN
  194.         io.WriteString("double entry");
  195.         io.WriteLn;
  196.         HALT(20);
  197.       END;
  198.     END;
  199.   END;
  200.   IF file.status # fs.eof THEN
  201.     io.WriteString("error reading file");
  202.     io.WriteLn;
  203.     HALT(20);
  204.   END;
  205.   IF toc THEN
  206.     io.WriteString("TABLE OF CONTENTS");
  207.     io.WriteLn; io.WriteLn;
  208.     avl.DoForward(root,TableOfContents);
  209.     IF ff THEN io.Write(asc.ff); END;
  210.   END;
  211.   avl.DoForward(root,WriteEntry);
  212.  IF fs.Close(file) THEN END;
  213. END ProcessFile;
  214.  
  215.  
  216. BEGIN
  217.   filename := versionString;
  218.  
  219.   nArgs := args.NumArgs();
  220.   IF (nArgs = 0) THEN
  221.     io.WriteString("Autodoc 2.0 by hartmut Goebel"); io.WriteLn;
  222.     io.WriteString("Usage: autodoc [options] infile [infile]"); io.WriteLn;
  223.     io.WriteLn;
  224.     io.WriteString("Options"); io.WriteLn;
  225.     io.WriteString("-i     - Process only INTERNAL autodocs"); io.WriteLn;
  226.     io.WriteString("-a     - Process autodocs starting with an asteric"); io.WriteLn;
  227.     io.WriteString("-s     - Process autodocs starting with a semicolon"); io.WriteLn;
  228.     io.WriteString("-m     - Process autodocs starting with (*"); io.WriteLn;
  229.     io.WriteString("-C     - Process autodocs starting with /*"); io.WriteLn;
  230.     io.WriteString("-w     - Turn off word wrap"); io.WriteLn;
  231.     io.WriteString("-f     - No form feeds between entries"); io.WriteLn;
  232.     io.WriteString("-I     - Output Table of Contents before entries"); io.WriteLn;
  233.     io.WriteString("-l<num>- Set line length to <num> (default 78, max. 256)"); io.WriteLn;
  234.     HALT(20);
  235.   END;
  236.  
  237.   internal := FALSE; cStyle := FALSE; asteric := FALSE; modula := FALSE;
  238.   semicolon := FALSE;
  239.   toc := FALSE; ff := TRUE; wordWrap := TRUE;
  240.   textWidth := defaultTextWidth-1; tabSize := defaultTabSize;
  241.  
  242.   argCnt := 0;
  243.   REPEAT
  244.     INC(argCnt);
  245.     args.GetArg(argCnt,filename);
  246.     IF filename[0] # "-" THEN
  247.       ProcessFile();
  248.     ELSE
  249.       CASE filename[1] OF
  250.       "i": internal := TRUE; |
  251.       "a": asteric := TRUE; |
  252.       "s": semicolon := TRUE; |
  253.       "m": modula := TRUE; |
  254.       "C": cStyle := TRUE; |
  255.       "w": wordWrap := FALSE; |
  256.       "f": ff := FALSE; |
  257.       "I": toc := TRUE; |
  258.       "l": str.Delete(filename,0,2);
  259.            IF Conversions.StringToInt(filename,textWidth) THEN
  260.              DEC(textWidth);
  261.              IF textWidth > maxTextWidth THEN
  262.                textWidth := maxTextWidth;
  263.              ELSIF textWidth < 0 THEN
  264.                textWidth := 0;
  265.              END;
  266.            ELSE
  267.              textWidth := defaultTextWidth;
  268.            END;
  269.       ELSE
  270.       END;
  271.     END;
  272.   UNTIL argCnt = nArgs;
  273. END Autodoc.
  274.